home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 22
/
Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso
/
Aminet
/
dev
/
e
/
amigae33a.lha
/
E_v3.3a
/
Src.lha
/
Src
/
Gfx
/
Chunky3d
/
rr.e
< prev
next >
Wrap
Text File
|
1996-11-02
|
7KB
|
227 lines
-> "Rude Racing" or "Wreckless Driving" or "The Need For Traffic Jams"
-> see main() below for the controls.
OPT OSVERSION=39, PREPROCESS
CONST CWIDTH=256,CHEIGHT=128
CONST SCHEIGHT=CHEIGHT+20
CONST TEMPBUFS=CWIDTH*CHEIGHT/2,BUFS=CWIDTH*CHEIGHT
MODULE '*c2p4', '*screenmodereq_db', 'tools/exceptions', 'tools/scrbuffer',
'intuition/screens', 'graphics/rastport', 'graphics/gfx',
'intuition/intuition'
/*------------------------------------------------------------------------*/
OBJECT rseg
bend:INT -> in degrees, often between -10 and +10, 0=straight
steepness:INT -> in degrees, often between -40 and +40, 0=flat
ENDOBJECT
CONST SEGX=256,SEGY=64, -> in pixels
LOOKAWAY=3,
SPEED=3,
WIDTHSTEP=5,
HORIZON=21
DEF road:PTR TO rseg,
roadlen, -> #of segments
cp=0, -> current pos in segments*pixels
turn=0, -> in degrees
rpos=0, -> in pixels, -128..127
sintab[271]:ARRAY OF INT,
tmap
-> both in range -90 to 90
#define sin(x) sintab[(x)+90]
#define cos(x) sintab[(x)+180]
PROC ahead() IS cp:=cp+(SEGY/SPEED)
PROC back() IS cp:=Bounds(cp-(SEGY/SPEED),0,1000000)
PROC tleft() IS turn:=Bounds(turn-3,-60,60)
PROC tright() IS turn:=Bounds(turn+3,-60,60)
PROC pleft() IS rpos:=Bounds(rpos+3,-128,127)
PROC pright() IS rpos:=Bounds(rpos-3,-128,127)
PROC center() IS (turn:=0) BUT (rpos:=0)
PROC render(cbuf)
DEF cpos,cpospix -> in segments, pixels in cur segment
DEF cangle,width=550,middle,ypos,pixstep=100,vp,vpos,vpospix,cbend=0,ccbend,lvpos,lvpospix,cmiddle
DEF omiddle,nval=0,nposr=0,posadj,te=0,tt=0
clearmem(cbuf,CWIDTH*HORIZON,$0E0E0E0E)
clearmem(cbuf+(CWIDTH*HORIZON),BUFS-(CWIDTH*HORIZON),$0F0F0F0F)
cpospix,cpos:=Mod(cp,SEGY); cpos:=Mod(cpos,roadlen)
cangle:=road[cpos].steepness
middle:=CWIDTH/2+(rpos*2)
ypos:=CHEIGHT-1
vp:=cp+(LOOKAWAY*SEGY)
lvpospix,lvpos:=Mod(vp,SEGY); lvpos:=Mod(lvpos,roadlen)
WHILE width>15
vpospix,vpos:=Mod(vp,SEGY); vpos:=Mod(vpos,roadlen)
IF lvpos<>vpos
cbend:=cbend+(road[lvpos].bend*256)
IF tt++=0 THEN cbend:=cbend*(SEGY-lvpospix-1)/SEGY
ENDIF
ccbend:=cbend+(road[vpos].bend*256*(SEGY-vpospix-1)/SEGY)
nval,omiddle:=Mod(sin(Bounds(ccbend/256,-90,90))+nval,20000/(vp-cp))
nposr,posadj:=Mod(WIDTHSTEP*rpos+nposr,256)
middle:=middle+omiddle-posadj
cmiddle:=middle+(sin(-turn)*32/ypos)
rline(cbuf,width,cmiddle,ypos,vpos,vpospix*CWIDTH+tmap)
ypos--
width:=width-WIDTHSTEP
vp:=vp+(pixstep/256)
->fake hills
->width:=width-WIDTHSTEP+(road[vpos].steepness/10)
->vp:=vp+Div(Mul((pixstep/256),100),(100-road[vpos].steepness))
pixstep:=pixstep/20+pixstep
lvpos:=vpos
ENDWHILE
ENDPROC
PROC rline(cbuf,width,middle,ypos,vpos,tm)
DEF x,pstep,pcur=0,end
x:=middle-(width/2)
IF (x>=CWIDTH) OR (x+width<=0) THEN RETURN
cbuf:=ypos*CWIDTH+cbuf
pstep:=256*1024/width
IF x<0
pcur:=-x*pstep
x:=0
ENDIF
end:=Min(CWIDTH-x,256*1024-pcur/pstep)+cbuf+x
MOVE.L tm,A0
MOVE.L cbuf,A1
ADDA.L x,A1
MOVE.L end,A2
MOVE.L pcur,D1
MOVE.L pstep,D2
MOVEQ #10,D3
tmloop:
MOVE.L D1,D0
LSR.L D3,D0
MOVE.B 0(A0,D0.L),(A1)+
ADD.L D2,D1
CMPA.L A2,A1
BMI.S tmloop
ENDPROC
PROC init()
DEF a
road:=[0,0,0,0,0,0,0,0,0,0,0,0,
2,0,4,0,
6,0,8,0,10,0,12,0,15,0,15,0,15,0,15,0,12,0,10,0,8,0,6,0,
4,0,2,0,
0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
-2,0,-4,0,
-6,0,-8,0,-10,0,-10,0,-8,0,-6,0,
-4,0,-2,0,
0,0,0,0,0,0,0,0,0,0,0,0,
0,10,0,15,0,20,0,30,0,20,0,15,0,10,
0,0,
0,0,0,15,0,20,0,-20,0,-15,0,0,0,0,0,0
]:rseg
roadlen:=ListLen(road)/2 -> rseg elems
FOR a:=-90 TO 180 DO sintab[a+90]:=!Fsin(a!/180.0*3.14159)*255.0!
tmap:={tmaplab}
ENDPROC
tmaplab: INCBIN 'e:rr/TEXTUREMAP_ROAD.br.chunky'
/*------------------------------------------------------------------------*/
PROC main() HANDLE
DEF dbs,scr=NIL:PTR TO screen,bm:PTR TO bitmap,win=NIL:PTR TO window,
tbuf2,tbuf3,tbuf2b,tbuf3b,cbuf,dbuf,dbuf2,sigbit,sig,safe=TRUE,a,temp,
imsg:PTR TO intuimessage,key,frames=0,dframes,fsec,ssec,smic,esec,emic
IF (dbs:=openreqscreen(CWIDTH,SCHEIGHT,4,'bla'))=NIL THEN Raise()
scr:=sb_GetScreen(dbs)
IF (win:=OpenW(0,0,CWIDTH-1,SCHEIGHT-1,
IDCMP_MOUSEBUTTONS OR IDCMP_VANILLAKEY,
WFLG_REPORTMOUSE OR WFLG_BORDERLESS OR WFLG_SIMPLE_REFRESH OR WFLG_BACKDROP OR WFLG_ACTIVATE,
'',scr,15,NIL))=NIL THEN Raise("WIN")
tbuf2:=NewM(TEMPBUFS+TEMPBUFS,2)
tbuf3:=tbuf2+TEMPBUFS
tbuf2b:=NewM(TEMPBUFS+TEMPBUFS,2)
tbuf3b:=tbuf2b+TEMPBUFS
NEW cbuf[BUFS]
NEW dbuf[BUFS]
NEW dbuf2[BUFS]
FOR a:=0 TO BUFS-1
dbuf[a]:=-1
dbuf2[a]:=-1
ENDFOR
FOR a:=1 TO 13 DO SetColour(scr,15-a-1,a*19,a*19,a*14)
SetColour(scr,0,212,0,9)
SetColour(scr,14,171,203,255)
SetColour(scr,15,156,194,0)
SetRast(scr.rastport,13)
bm:=sb_NextBuffer(dbs)
SetRast(scr.rastport,13)
init()
IF (sigbit:=AllocSignal(-1))<>-1
sig:=Shl(1,sigbit)
CurrentTime({ssec},{smic})
REPEAT
render(cbuf)
IF safe=FALSE
Wait(sig)
safe:=TRUE
ENDIF
bm:=sb_NextBuffer(dbs)
c2p4(tbuf3,tbuf2,cbuf,dbuf,bm.planes,FindTask(NIL),sig,gfxbase)
frames++
temp:=dbuf; dbuf:=dbuf2; dbuf2:=temp
temp:=tbuf2; tbuf2:=tbuf2b; tbuf2b:=temp
temp:=tbuf3; tbuf3:=tbuf3b; tbuf3b:=temp
IF imsg:=GetMsg(win.userport)
IF imsg.class=IDCMP_VANILLAKEY
key:=imsg.code
SELECT key
CASE "a"; ahead()
CASE "b"; back()
CASE "z"; tleft()
CASE "x"; tright()
CASE "n"; pleft()
CASE "m"; pright()
CASE "c"; center()
-> "q" quits
ENDSELECT
ENDIF
ReplyMsg(imsg)
ENDIF
safe:=FALSE
UNTIL key="q"
CurrentTime({esec},{emic})
IF safe=FALSE THEN Wait(sig)
FreeSignal(sigbit)
ENDIF
EXCEPT DO
IF win THEN CloseWindow(win)
closereqscreen(dbs)
dframes:=esec-ssec*100+(emic-smic/10000)
fsec:=frames*10000/dframes
IF frames THEN WriteF('calculated \d pictures \d.\z\d[2] seconds, giving \d.\z\d[2] f/s\n',frames,Div(dframes,100),Mod(dframes,100),Div(fsec,100),Mod(fsec,100))
SELECT exception
CASE "SCR"; WriteF('no screen!\n')
CASE "REQ"; WriteF('Error: Could not allocate ASL request\n')
CASE "ASL"; WriteF('Error: Could not open ASL library\n')
ENDSELECT
report_exception()
ENDPROC
PROC clearmem(mem,size,pat)
DEF e:REG,a:REG,b:REG,c:REG,d:REG
e:=size/16-1
a:=b:=c:=d:=pat
MOVE.L mem,A0
ADD.L size,A0
clloop:
MOVEM.L a/b/c/d,-(A0)
DBRA e,clloop
ENDPROC